#coding=utf-8
#验证一个文本里面的密码，如果正确返回，不正确重试3次，添加注册（用户名和密码）登陆流程，密码文件使用 pickle 标准库保存
import pickle

#file
u_p_file = 'user_passwd.txt'

break_flag = False #在父循环中设定一个跳出标志，子循环只要想连父亲一块跳出时，就把这个标志改成True 

#读写账号密码  
def read_file(thefile):
	try:
		with open(thefile,'rb') as upfile:
			u_data = pickle.load(upfile)
		return u_data		
	except Exception as e:
		raise e

#写入账号密码
def write_file(thefile,thedic):
	try:
		with open(thefile,'wb') as upfile:
			pickle.dump(thedic,upfile)
	except Exception as e:
		raise e

#login
def login():
	input_user = input("\033[1;32m 请输入你的用户名: \033[0m")
	count = 0
	#check input_user is exists or not.
	user_data = read_file(u_p_file)
	if input_user in user_data:
		while count<3:
			input_passwd = input("\033[1;32m 请输入你的密码: \033[0m")
			#check input_passwd is right or not
			if input_passwd == user_data[input_user]:
				print("\033[1;35m 登录成功!欢迎！ \033[0m")
				break
			else:
				print("\033[1;31m 抱歉，密码错误，注意密码错误三次将退出！ \033[0m")
				count += 1
				continue
		else:
			print("\033[1;31m *\033[0m"*20)
			print("\033[1;31m 错误输入密码已达三次，退出！\033[0m")
		#完成了登录步骤，该跳出整个循环了
		#因为Python中没有变量的声明，这里需要global指明改变的break_flag是全局变量，否则这里改变的只是局部的break_flag，外部的break_flag不会变。
		global break_flag
		break_flag = True
	else:
		print("\033[1;31m 没有该用户，请核实用户名! \033[0m")

#注册用户
def register():
	while True:
		try:
			re_in_user = input("\033[1;32m 请输入用户名: \033[0m")
			#check user if exists.
			user_data = read_file(u_p_file)
			if re_in_user in user_data:
				print("\033[1;31m 抱歉，该用户名已经被注册！！！ \033[0m")
				if_continue_register = input("\033[1;32m 是否继续注册?输入:1(继续注册)，2(退出注册),3(退出程序) \033[0m \n")
				if_continue_register = int(if_continue_register)
				if if_continue_register == 1:
					continue
				elif if_continue_register == 2:
					break
				elif if_continue_register == 3:
					#因为Python中没有变量的声明，这里需要global指明改变的break_flag是全局变量，否则这里改变的只是局部的break_flag，外部的break_flag不会变。
					global break_flag
					break_flag = True
					break
				else:
					print("\033[1;31m 输入错误，只能输入1 2 3中的一个。 \033[0m")
			else:
				re_in_passwd = input("\033[1;35m 用户名可以使用,请输入密码: \033[0m")
				user_data[re_in_user] = re_in_passwd
				write_file(u_p_file,user_data)
				print("\033[1;35m 注册成功!!! \033[0m")
				break
		except Exception as e:
			raise e
	

if __name__ == '__main__':
	while True:
		print("\033[1;32m ***welcome*** \033[0m")
		chose = input("\033[1;32m 请选择：1.登陆  2.注册  3.退出 \033[0m \n")
		chose = int(chose)
		if chose == 1:
			login()
		elif chose == 2:
			register()
		elif chose == 3:
			print("\033[1;35m ***已退出*** \033[0m")
			break
		else:
			print("\033[1;31m 抱歉，选项输入错误，只能输入数字1 2 3中的一个！ \033[0m")
			continue
		
		#如果子类循环想父循环也跳出
		if break_flag:
			break
